package com.cmii.sjw.department.control.jsc.util;

import java.math.BigInteger;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.UUID;

public class AuthCodeUtil {

    private static final String BASE62 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";

    /**
     * 根据高校和系统生成授权码（MD5 + Base62 编码，截取20位）
     *
     * @param organizationCode 高校编码
     * @param applicationSystemName    系统来源
     * @return 授权码（长度20位，字母+数字）
     */
    public static String generateAuthCode(String organizationCode, String applicationSystemName) {
        // 1. 拼接原始字符串
        String raw = organizationCode + ":" + applicationSystemName + ":" + UUID.randomUUID();

        // 2. 执行 MD5
        byte[] md5Bytes = md5Bytes(raw);

        // 3. 用 Base62 编码后转为字符串
        String base62Code = base62Encode(md5Bytes);

        // 4. 截取前20位作为授权码
        return base62Code.length() >= 20 ? base62Code.substring(0, 20) : base62Code;
    }

    private static byte[] md5Bytes(String input) {
        try {
            MessageDigest md = MessageDigest.getInstance("MD5");
            return md.digest(input.getBytes(StandardCharsets.UTF_8));
        } catch (NoSuchAlgorithmException e) {
            throw new RuntimeException("MD5算法不可用", e);
        }
    }

    private static String base62Encode(byte[] data) {
        BigInteger bigInt = new BigInteger(1, data); // 1表示正数
        StringBuilder sb = new StringBuilder();
        while (bigInt.compareTo(BigInteger.ZERO) > 0) {
            BigInteger[] divRem = bigInt.divideAndRemainder(BigInteger.valueOf(62));
            sb.append(BASE62.charAt(divRem[1].intValue()));
            bigInt = divRem[0];
        }
        return sb.reverse().toString();
    }

    public static void main(String[] args) {
        String code = generateAuthCode("重庆大学", "惠学生");
        System.out.println("生成的授权码：" + code);
    }
}